<?php namespace Home\Controller; 

use Hdphp\Controller\Controller;

/**
 * 列表页控制器
 * 田昭鹏
 */

class ListController extends Controller{
	//构造函数
	public function __init(){

	}
	
    //动作
    public function index(){
    	// 获取当前分类序号
        $cid=Q('get.cid');
        // 获得父级分类   标题导航
        $pid=Db::table('category')->where('cid',$cid)->pluck('pid');
        $type=$this->getFather(Db::table('category')->get(),$pid);
        // 添加自己
        $type[]=$cid;
        // 获得数据
        $typeData=Db::table('category')->whereIn('cid',$type)->get();
        // p($typeData);die;
        View::with('typeData',$typeData);

        // 获得当前分类的下一级子集
        $typeSon=Db::table('category')->where('pid',$cid)->get();
        // 压入分类统计字段
        $typeSon=$this->typeCount($typeSon);
        View::with('typeSon',$typeSon);



        // 获得分类的属性及规格
        // 1.获得当前分类及子集，获取子集
        $cids=$this->getSon(Db::table('category')->get(),$cid);
        $cids[]=$cid;
        // 2.寻找当前分类的商品  通过商品去寻找商品属性(去掉重复属性)
        $gids=Db::table('goods')->whereIn('category_cid',$cids)->lists('gid');
        if(empty($gids)){
            $goodsValue=array();
        }else{
            $goodsValue=Db::table('goods_attr')->whereIn('goods_gid',$gids)->groupBy('gavalue')->orderBy('gaid','ASC')->get();
        }
        // 3.重组数组  分配页面
        $goodsValue=$this->getAttr($gids,$goodsValue);
        // p($goodsValue);
        View::with('goodsValue',$goodsValue);



        // 组合param参数  进行筛选
        if(empty($goodsValue)){
            $param=array();
        }else{
            $param=isset($_GET['param'])?explode('_', $_GET['param']):array_fill(0, count($goodsValue), 0);
        }
        View::with('param',$param);
        // p($param);


        // 进行过滤   获取商品id
        $result=$this->getGoods($param,$gids);
        // p($result);
        if(empty($result)){
            $goodsData=array();
            $total=0;
        }else{
            // 拉取商品信息
            $goodsData=Db::table('goods')->whereIn('gid',$result)->get();
            $total=count($goodsData);
            // p($goodsData);
        }
        View::with('total',$total);
        View::with('goodsData',$goodsData);

       	View::make();
    }

    // 获得筛选的属性
    private function getParam($param){
        $temp=array();
        foreach ($param as $k => $v) {
            if($v){
                $taid=Db::table('goods_attr')->where('gaid',$v)->pluck('type_attr_taid');
                $temp[Db::table('type_attr')->where('taid',$taid)->pluck('taname')]=Db::table('goods_attr')->where('gaid',$v)->pluck('gavalue');
            }
        }
        // p($temp);
        return $temp;
    }


    // 获得商品id
    private function getGoods($param,$gids){
        // 声明数组
        $temp=array();
        $paramData=array();
        foreach ($param as $k => $v) {
            if($v){
                $name=Db::table('goods_attr')->where('gaid',$v)->pluck('gavalue');
                $temp[]=Db::table('goods_attr')->where('gavalue',$name)->lists('goods_gid');
                $paramData[$k]['name']=Db::table('goods_attr')->where('gaid',$v)->pluck('gavalue');
                $taid=Db::table('goods_attr')->where('gaid',$v)->pluck('type_attr_taid');
                $paramData[$k]['type_name']=Db::table('type_attr')->where('taid',$taid)->pluck('taname');
            }
        }
        // p($paramData);
        View::with('paramData',$paramData);
        // 求交集
        if($temp){
            // 第一个交给盒子
            $box=$temp[0];
            // 循环取交集
            foreach ($temp as $k => $v) {
                $box=array_intersect($box, $v);
            }
            // 最后和总  取交集
            $result=array_intersect($box, $gids);
        }else{
            // 没有限制
            $result=$gids;
        }

        // 返回值
        return $result;
    }




    // 压入 分类 统计字段
    private function typeCount($typeSon){
        // p($typeSon);
        // 循环
        foreach ($typeSon as $k => $v) {
            // 获得当前分类及子集，获取子集
            $cids=$this->getSon(Db::table('category')->get(),$v['cid']);
            $cids[]=$v['cid'];
            if(is_array($v)){
                $typeSon[$k]['total']=Db::table('goods')->whereIn('category_cid',$cids)->count();
            }
        }
        // p($typeSon);
        return $typeSon;
    }


    // 获得商品属性  重组数组方法
    private function getAttr($gids,$goodsValue){
        // 声明数组
        $temp=array();
        if(!is_array($gids)) return $temp;
        // 先压入统计字段
        foreach($goodsValue as $k=>$v){
            $goodsValue[$k]['sonNum']=Db::table('goods_attr')->whereIn('goods_gid',$gids)->where('gavalue',$v['gavalue'])->count();
        }
        // 分组   颜色  尺码  风格 等
        foreach ($goodsValue as $k => $v) {
            $temp[$v['type_attr_taid']][]=$v;
        }
        // 声明数组
        $temps=array();
        foreach ($temp as $k => $v) {
            $temps[]=array(
                'name'=>Db::table('type_attr')->where('taid',$k)->pluck('taname'),
                'value'=>$v
                );
        }
        // p($temps);
        return $temps;
    }

    // 获得父级方法
    private function getFather($data,$pid){
        // 声明数组  防止报错
        $temp=array();
        // 循环添加数组元素
        foreach ($data as $v) {
            // 判断子集
            if($pid==$v['cid']){
                // 压入数组
                $temp[]=$v['cid'];
                // 合并数组
                $temp=array_merge($this->getFather($data, $v['pid']),$temp);
            }
        }
        // 返回数组
        return $temp;
    }

    // 获得子集方法
    private function getSon($allArray,$cid){
        // 声明数组  防止报错
        $temp=array();
        // 循环添加数组元素
        foreach ($allArray as $v) {
            // 判断子集
            if($cid==$v['pid']){
                // 压入数组
                $temp[]=$v['cid'];
                // 合并数组
                $temp=array_merge($temp,$this->getSon($allArray, $v['cid']));
            }
        }
        // 返回数组
        return $temp;
    }
}
